package kotlinquanweizhinan.chapt09.takeif

import java.io.File

class test {
}

fun main() {
    /*
    * takeIf函数需要判断lambda中提供的条件表达式(叫predicate)，给出true或false结果。如果判断结果是true,
    * 从takeIf函数返回接收者对象;如果是false,则返回null
    * */
    //下面这段代码逻辑是,当且仅当文件可读可写时，才读取文件内容
    val fileContents = File("myfiel.txt")
        .takeIf { it.canRead() && it.canWrite() }
        ?.readText()

    //不用takeIf函数，代码稍显啰唆
    val file = File("myfile.txt")
    val fileContents1 = if(file.canRead() && file.canWrite()){
        file.readText()
    }else{
        null
    }

    /*
     * takeIf版本不需要file临时变量，也不考虑null返回值的情况。如果需要判断某个条件是否满足，再决定是否
     * 可以赋值变量或执行某项任务，takeIf就非常有用。概念上讲，takeIf函数类似于if语句，但它优势是可以直接
     * 在对象实例上调用，避免了临时变量赋值的麻烦。
     */

    /**
     * takeUnless
     * takeUnless和takeIf唯一的区别是:只有判断你给定的条件结果是false时，
     * takeUnless才会返回原始接收者对象。下面的示例代码读取文件，前提条件是文件不是隐藏文件(否则返回null)：
     */
    val fileContents2 = File("Myfile.txt").takeUnless { it.isHidden }?.readText()

    // 建议习题不要用takeUnless，尤其是有很多复杂的条件要判断的时候，因为要读懂理清代码比较费时。
}